package com.nolydake.swingnote;

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;
import javax.swing.JOptionPane;

import org.apache.log4j.Logger;

import com.nolydake.swingnote.dao.NoteDao;
import com.nolydake.swingnote.dao.NoteForderDao;
import com.nolydake.swingnote.gui.MainFrame;
import com.nolydake.swingnote.util.FileUtil;
import com.nolydake.swingnote.util.SQLiteUtil;

public class SwingNoteApplication {

    /** 日志对象 */
    private static final Logger LOG = Logger.getLogger(SwingNoteApplication.class);

    /**
     * 单例对象
     */
    private static SwingNoteApplication instance = null;

    public static DataSource dataSource = null;

    private SwingNoteApplication() {
        super();
        initDataSource();// 初始化数据库连接池
    }

    /**
     * 单例方法
     * 
     * @return 单例对象
     */
    synchronized public static SwingNoteApplication getInstance() {

        if (instance == null) {
            instance = new SwingNoteApplication();
        }

        return instance;
    }

    /**
     * 启动应用
     */
    public void startApplication() {
        new MainFrame().setVisible(true);
    }

    /**
     * 初始化数据库连接池
     */
    private void initDataSource() {
        String userName = System.getProperty("user.name");
        LOG.info("当前登录用户为：" + userName);
        if (userName == null || userName.trim().length() == 0) {
            JOptionPane.showMessageDialog(null,
                    "无法获取当前用户名，请检查运行环境是否支持命令\n\n*********\nSystem.getProperty(\"user.name\");\n*********");
            System.exit(1);
            return;
        }

        File dbFile = new File(FileUtil.getNotesPath(), userName + ".db");

        dbFile.getParentFile().mkdirs();

        if (LOG.isDebugEnabled()) {
            LOG.debug("数据文件不存在，创建数据文件：" + dbFile.getAbsolutePath());
        }

        // 创建数据库连接
        try {
            dataSource = SQLiteUtil.initDataSource(dbFile);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "无法加载数据文件，请检查以下文件使用情况\n\n*********\n" + dbFile + "\n*********");
            System.exit(1);
            return;
        }

        String message = null;

        /* 考虑到不管数据文件是否存在，都可以使用if exist的方式来创建表，这样我们去掉一个判断，降低了控制的逻辑 */
        /* 考虑到数据表比较少 */

        /**
        // 开始进行初始化
        NoteDao notedao = new NoteDao();
        // notedao.setConnection(dataSource);
        NoteForderDao noteForderDao = new NoteForderDao();
        // noteForderDao.setConnection(dataSource);

        // 初始化数据库
        message = notedao.initDB();
        if (message != null) {
            JOptionPane.showMessageDialog(null, "创建数据文件出现错误：" + message);
            System.exit(1);
            return;
        }

        message = noteForderDao.initDB();
        if (message != null) {
            JOptionPane.showMessageDialog(null, "创建数据文件出现错误：" + message);
            System.exit(1);
            return;
        }

        if (LOG.isDebugEnabled()) {
            LOG.debug("开始校验数据文件正确性...");
        }

        message = notedao.validateDB();
        if (message != null) {
            JOptionPane.showMessageDialog(null, "校验数据文件出现错误：" + message);
            System.exit(1);
            return;
        }

        message = noteForderDao.validateDB();
        if (message != null) {
            JOptionPane.showMessageDialog(null, "校验数据文件出现错误：" + message);
            System.exit(1);
            return;
        }*/
    }
}
